// RAP [bm]: missing file handling - download/upload?
///*******************************************************************************
// * Copyright (c) 2005, 2009 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// *     IBM Corporation - initial API and implementation
// *******************************************************************************/
//package org.eclipse.ui.internal.wizards.preferences;
//
//import java.io.File;
//import java.util.Arrays;
//import java.util.List;
//import java.util.Map;
//import org.eclipse.core.runtime.CoreException;
//import org.eclipse.core.runtime.Path;
//import org.eclipse.core.runtime.preferences.ConfigurationScope;
//import org.eclipse.core.runtime.preferences.IPreferenceFilter;
//import org.eclipse.core.runtime.preferences.InstanceScope;
//import org.eclipse.jface.dialogs.Dialog;
//import org.eclipse.jface.dialogs.IDialogConstants;
//import org.eclipse.jface.dialogs.IDialogSettings;
//import org.eclipse.jface.dialogs.MessageDialog;
//import org.eclipse.jface.viewers.CheckStateChangedEvent;
//import org.eclipse.jface.viewers.CheckboxTreeViewer;
//import org.eclipse.jface.viewers.ICheckStateListener;
//import org.eclipse.jface.viewers.ISelection;
//import org.eclipse.jface.viewers.ISelectionChangedListener;
//import org.eclipse.jface.viewers.IStructuredSelection;
//import org.eclipse.jface.viewers.SelectionChangedEvent;
//import org.eclipse.jface.viewers.TreeViewer;
//import org.eclipse.jface.wizard.WizardPage;
//import org.eclipse.osgi.util.NLS;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.events.SelectionAdapter;
//import org.eclipse.swt.events.SelectionEvent;
//import org.eclipse.swt.events.SelectionListener;
//import org.eclipse.swt.graphics.Font;
//import org.eclipse.swt.graphics.Image;
//import org.eclipse.swt.layout.GridData;
//import org.eclipse.swt.layout.GridLayout;
//import org.eclipse.swt.widgets.Button;
//import org.eclipse.swt.widgets.Combo;
//import org.eclipse.swt.widgets.Composite;
//import org.eclipse.swt.widgets.Event;
//import org.eclipse.swt.widgets.FileDialog;
//import org.eclipse.swt.widgets.Group;
//import org.eclipse.swt.widgets.Label;
//import org.eclipse.swt.widgets.Listener;
//import org.eclipse.swt.widgets.Shell;
//import org.eclipse.swt.widgets.Text;
//import org.eclipse.swt.widgets.Widget;
//import org.eclipse.ui.dialogs.FilteredTree;
//import org.eclipse.ui.dialogs.IOverwriteQuery;
//import org.eclipse.ui.dialogs.PatternFilter;
//import org.eclipse.ui.internal.WorkbenchPlugin;
//import org.eclipse.ui.internal.preferences.PreferenceTransferElement;
//import org.eclipse.ui.internal.preferences.PreferenceTransferManager;
//import org.eclipse.ui.model.WorkbenchLabelProvider;
//
///**
// * Base class for preference export/import pages.
// * 
// * @since 3.1
// */
//public abstract class WizardPreferencesPage extends WizardPage implements
//		Listener, IOverwriteQuery {
//
//	// widgets
//	protected Combo destinationNameField;
//
//	private Button destinationBrowseButton;
//
//	private Button overwriteExistingFilesCheckbox;
//
//	protected FilteredTree transfersTree;
//	
//	protected Text descText;
//
//	private Composite buttonComposite;
//
//	private Button transferAllButton;
//
//	private Group group;
//
//	private CheckboxTreeViewer viewer;
//
//	private Button selectAllButton;
//
//	private Button deselectAllButton;
//
//	// dialog store id constants
//	private static final String STORE_DESTINATION_NAMES_ID = "WizardPreferencesExportPage1.STORE_DESTINATION_NAMES_ID";//$NON-NLS-1$
//
//	private static final String STORE_OVERWRITE_EXISTING_FILES_ID = "WizardPreferencesExportPage1.STORE_OVERWRITE_EXISTING_FILES_ID";//$NON-NLS-1$
//
//	private static final String TRANSFER_ALL_PREFERENCES_ID = "WizardPreferencesExportPage1.EXPORT_ALL_PREFERENCES_ID"; //$NON-NLS-1$
//
//	private static final String TRANSFER_PREFERENCES_NAMES_ID = "WizardPreferencesExportPage1.TRANSFER_PREFERENCES_NAMES_ID"; //$NON-NLS-1$
//
//	private PreferenceTransferElement[] transfers;
//
//	private String currentMessage;
//
//	private static final String STORE_DESTINATION_ID = null;
//
//	protected static final int COMBO_HISTORY_LENGTH = 5;
//
//    
//	/**
//	 * @param pageName
//	 */
//	protected WizardPreferencesPage(String pageName) {
//		super(pageName);
//	}
//
//	/**
//	 * Creates a new button with the given id.
//	 * <p>
//	 * The <code>Dialog</code> implementation of this framework method creates
//	 * a standard push button, registers for selection events including button
//	 * presses and registers default buttons with its shell. The button id is
//	 * stored as the buttons client data. Note that the parent's layout is
//	 * assumed to be a GridLayout and the number of columns in this layout is
//	 * incremented. Subclasses may override.
//	 * </p>
//	 * 
//	 * @param parent
//	 *            the parent composite
//	 * @param id
//	 *            the id of the button (see <code>IDialogConstants.*_ID</code>
//	 *            constants for standard dialog button ids)
//	 * @param label
//	 *            the label from the button
//	 * @param defaultButton
//	 *            <code>true</code> if the button is to be the default button,
//	 *            and <code>false</code> otherwise
//	 */
//	protected Button createButton(Composite parent, int id, String label,
//			boolean defaultButton) {
//		// increment the number of columns in the button bar
//		((GridLayout) parent.getLayout()).numColumns++;
//
//		Button button = new Button(parent, SWT.PUSH);
//		button.setFont(parent.getFont());
//
//		setButtonLayoutData(button);
//
//		button.setData(new Integer(id));
//		button.setText(label);
//
//		if (defaultButton) {
//			Shell shell = parent.getShell();
//			if (shell != null) {
//				shell.setDefaultButton(button);
//			}
//			button.setFocus();
//		}
//		return button;
//	}
//
//	/**
//	 * Add the passed value to self's destination widget's history
//	 * 
//	 * @param value
//	 *            java.lang.String
//	 */
//	protected void addDestinationItem(String value) {
//		destinationNameField.add(value);
//	}
//
//	/**
//	 * (non-Javadoc) Method declared on IDialogPage.
//	 */
//	public void createControl(Composite parent) {
//		initializeDialogUnits(parent);
//		Composite composite = new Composite(parent, SWT.NULL);
//		composite.setLayout(new GridLayout());
//		composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
//				| GridData.HORIZONTAL_ALIGN_FILL));
//		
//
//		createTransferArea(composite);
//		setPreferenceTransfers();
//
//		restoreWidgetValues();
//		// updateWidgetEnablements();
//
//		// can not finish initially, but don't want to start with an error
//		// message either
//		if (!(validDestination() && validateOptionsGroup() && validateSourceGroup())) {
//			setPageComplete(false);
//		}
//
//		setControl(composite);
//
//		giveFocusToDestination();
//		Dialog.applyDialogFont(composite);
//	}
//
//	/**
//	 * @param composite
//	 */
//	protected abstract void createTransferArea(Composite composite);
//
//	/**
//	 * Validate the destination group.
//	 * @return <code>true</code> if the group is valid. If
//	 * not set the error message and return <code>false</code>.
//	 */
//	protected boolean validateDestinationGroup() {
//		if (!validDestination()) {
//			currentMessage = getInvalidDestinationMessage();
//			return false;
//		}
//
//		return true;
//	}
//
//	/**
//	 * Return the message that indicates an invalid destination.
//	 * @return String
//	 */
//	abstract protected String getInvalidDestinationMessage();
//
//	private String getNoOptionsMessage() {
//		return PreferencesMessages.WizardPreferencesPage_noOptionsSelected;
//	}
//	
//	protected boolean validDestination() {
//		File file = new File(getDestinationValue());
//		return !(file.getPath().length() <= 0 || file.isDirectory());
//	}
//
//	protected void setPreferenceTransfers() {
//		PreferenceTransferElement[] transfers = getTransfers();
//		viewer.setInput(transfers);
//	}
//
//	/*
//	 * return the PreferenceTransgerElements specified
//	 */
//	protected PreferenceTransferElement[] getTransfers() {
//		if (transfers == null) {
//			transfers = PreferenceTransferManager.getPreferenceTransfers();
//		}
//		return transfers;
//	}
//
//	/**
//	 * @param composite
//	 */
//	protected void createTransfersList(Composite composite) {
//
//		transferAllButton = new Button(composite, SWT.CHECK);
//		transferAllButton.setText(getAllButtonText());
//		
//		group = new Group(composite, SWT.NONE);
//		GridData groupData = new GridData(GridData.FILL_BOTH);
//		groupData.horizontalSpan = 2;
//		groupData.horizontalIndent = IDialogConstants.INDENT;
//		Object compositeLayout = composite.getLayout();
//		if (compositeLayout instanceof GridLayout) {
//			groupData.horizontalIndent -= ((GridLayout) compositeLayout).marginWidth;
//			groupData.horizontalIndent -= ((GridLayout) compositeLayout).marginLeft;
//		}
//		group.setLayoutData(groupData);
//
//		GridLayout layout = new GridLayout();
//		group.setLayout(layout);
//		
//		transfersTree = createFilteredTree(group);
//
//		transfersTree.setLayoutData(new GridData(GridData.FILL_BOTH));
//
//		viewer = (CheckboxTreeViewer) transfersTree.getViewer();
//		viewer.setContentProvider(new PreferencesContentProvider());
//		viewer.setLabelProvider(new WorkbenchLabelProvider());
//
//		Label description = new Label(group, SWT.NONE);
//		description.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
//		description.setText(PreferencesMessages.WizardPreferences_description);
//		
//		descText = new Text(group, SWT.V_SCROLL | SWT.READ_ONLY
//				| SWT.BORDER | SWT.WRAP);
//		GridData descriptionData = new GridData(GridData.FILL_BOTH);
//		descriptionData.heightHint = convertHeightInCharsToPixels(3);
//		descText.setLayoutData(descriptionData);
//		
//		transferAllButton.addSelectionListener(new SelectionAdapter() {
//			public void widgetSelected(SelectionEvent e) {
//				if (transferAllButton.getSelection()) {
//					viewer.setAllChecked(false);
//				}
//				updateEnablement();
//				updatePageCompletion();
//			}
//		});
//
//		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
//
//			public void selectionChanged(SelectionChangedEvent event) {
//				updateDescription();
//			}
//		});
//
//		viewer.addCheckStateListener(new ICheckStateListener() {
//			public void checkStateChanged(CheckStateChangedEvent event) {
//				transferAllButton.setSelection(false);
//				updateEnablement();
//				updatePageCompletion();
//			}
//		});
//
//		addSelectionButtons(group);
//
//	}
//
//	protected void updateDescription() {
//		ISelection selection = viewer.getSelection();
//		String desc = ""; //$NON-NLS-1$
//		if (!selection.isEmpty()) {
//			Object element = ((IStructuredSelection) selection)
//					.getFirstElement();
//			if ((element instanceof PreferenceTransferElement)) {
//				desc = ((PreferenceTransferElement) element).getDescription();
//			}
//		}
//		descText.setText(desc);
//	}
//
//	private FilteredTree createFilteredTree(Group group) {
//		int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER;
//		FilteredTree transfersTree = new FilteredTree(group, style,
//				new PatternFilter(), true) {
//			protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
//				return new CheckboxTreeViewer(parent, style);
//			}
//		};
//		return transfersTree;
//	}
//
//	protected abstract String getChooseButtonText();
//
//	protected abstract String getAllButtonText();
//
//	/**
//	 * Add the selection and deselection buttons to the composite.
//	 * 
//	 * @param composite
//	 *            org.eclipse.swt.widgets.Composite
//	 */
//	private void addSelectionButtons(Composite composite) {
//		Font parentFont = composite.getFont();
//		buttonComposite = new Composite(composite, SWT.NONE);
//		GridLayout layout = new GridLayout();
//		layout.numColumns = 2;
//		buttonComposite.setLayout(layout);
//		GridData data = new GridData(GridData.GRAB_HORIZONTAL);
//		data.grabExcessHorizontalSpace = true;
//		buttonComposite.setLayoutData(data);
//		buttonComposite.setFont(parentFont);
//		
//		selectAllButton = createButton(buttonComposite,
//				IDialogConstants.SELECT_ALL_ID,
//				PreferencesMessages.SelectionDialog_selectLabel, false);
//
//		SelectionListener listener = new SelectionAdapter() {
//			public void widgetSelected(SelectionEvent e) {
//				viewer.setAllChecked(true);
//				updatePageCompletion();
//			}
//		};
//		selectAllButton.addSelectionListener(listener);
//		selectAllButton.setFont(parentFont);
//		
//		deselectAllButton = createButton(buttonComposite,
//				IDialogConstants.DESELECT_ALL_ID,
//				PreferencesMessages.SelectionDialog_deselectLabel, false);
//
//		listener = new SelectionAdapter() {
//			public void widgetSelected(SelectionEvent e) {
//				viewer.setAllChecked(false);
//				updatePageCompletion();
//			}
//		};
//		deselectAllButton.addSelectionListener(listener);
//		deselectAllButton.setFont(parentFont);
//	}
//
//	/**
//	 * @param bool
//	 */
//	protected void setAllChecked(boolean bool) {
//		transferAllButton.setSelection(false);
//	}
//
//	/**
//	 * Create the export destination specification widgets
//	 * 
//	 * @param parent
//	 *            org.eclipse.swt.widgets.Composite
//	 */
//	protected void createDestinationGroup(Composite parent) {
//		// destination specification group
//		Composite destinationSelectionGroup = new Composite(parent, SWT.NONE);
//		GridLayout layout = new GridLayout();
//		layout.numColumns = 3;
//		destinationSelectionGroup.setLayout(layout);
//		destinationSelectionGroup.setLayoutData(new GridData(
//				GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
//		
//		Label dest = new Label(destinationSelectionGroup, SWT.NONE);
//		dest.setText(getDestinationLabel());
//		
//		// destination name entry field
//		destinationNameField = new Combo(destinationSelectionGroup, SWT.SINGLE
//				| SWT.BORDER);
//		destinationNameField.addListener(SWT.Modify, this);
//		destinationNameField.addListener(SWT.Selection, this);
//		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
//				| GridData.GRAB_HORIZONTAL);
//		destinationNameField.setLayoutData(data);
//		
//		// destination browse button
//		destinationBrowseButton = new Button(destinationSelectionGroup,
//				SWT.PUSH);
//		destinationBrowseButton
//				.setText(PreferencesMessages.PreferencesExport_browse);
//		setButtonLayoutData(destinationBrowseButton);
//		destinationBrowseButton.addListener(SWT.Selection, this);
//		
//		new Label(parent, SWT.NONE); // vertical spacer
//	}
//
//	/**
//	 * Create the export options specification widgets.
//	 * 
//	 * @param parent
//	 *            org.eclipse.swt.widgets.Composite
//	 */
//	protected void createOptionsGroup(Composite parent) {
//		// options group
//	
//		Composite optionsGroup = new Composite(parent, SWT.NONE);
//		GridLayout layout = new GridLayout();
//		layout.marginHeight = 0;
//		optionsGroup.setLayout(layout);
//		optionsGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
//				| GridData.GRAB_HORIZONTAL));
//	
//		// overwrite... checkbox
//		overwriteExistingFilesCheckbox = new Button(optionsGroup, SWT.CHECK
//				| SWT.LEFT);
//		overwriteExistingFilesCheckbox
//				.setText(PreferencesMessages.ExportFile_overwriteExisting);
//		
//	}
//
//	/**
//	 * Attempts to ensure that the specified directory exists on the local file
//	 * system. Answers a boolean indicating success.
//	 * 
//	 * @return boolean
//	 * @param directory
//	 *            java.io.File
//	 */
//	protected boolean ensureDirectoryExists(File directory) {
//		if (!directory.exists()) {
//			if (!queryYesNoQuestion(PreferencesMessages.PreferencesExport_createTargetDirectory)) {
//				return false;
//			}
//
//			if (!directory.mkdirs()) {
//				MessageDialog
//						.open(
//								MessageDialog.ERROR,
//								getContainer().getShell(),
//								PreferencesMessages.PreferencesExport_error,
//								PreferencesMessages.PreferencesExport_directoryCreationError,
//								SWT.SHEET);
//				return false;
//			}
//		}
//		return true;
//	}
//
//	/**
//	 * Displays a Yes/No question to the user with the specified message and
//	 * returns the user's response.
//	 * 
//	 * @param message
//	 *            the question to ask
//	 * @return <code>true</code> for Yes, and <code>false</code> for No
//	 */
//	protected boolean queryYesNoQuestion(String message) {
//		MessageDialog dialog = new MessageDialog(getContainer().getShell(),
//				PreferencesMessages.Question, (Image) null, message,
//				MessageDialog.NONE, new String[] { IDialogConstants.YES_LABEL,
//						IDialogConstants.NO_LABEL }, 0) {
//			protected int getShellStyle() {
//				return super.getShellStyle() | SWT.SHEET;
//			}
//		};
//		// ensure yes is the default
//
//		return dialog.open() == 0;
//	}
//
//	/**
//	 * If the target for export does not exist then attempt to create it. Answer
//	 * a boolean indicating whether the target exists (ie.- if it either
//	 * pre-existed or this method was able to create it)
//	 * 
//	 * @return boolean
//	 */
//	protected boolean ensureTargetIsValid(File file) {
//		if (file.exists()) {
//			if (!getOverwriteExisting()) {
//				String msg = NLS
//						.bind(
//								PreferencesMessages.WizardPreferencesExportPage1_overwrite,
//								file.getAbsolutePath());
//				if (!queryYesNoQuestion(msg)) {
//					return false;
//				}
//			}
//			file.delete();
//		} else if (!file.isDirectory()) {
//			File parent = file.getParentFile();
//			if (parent != null) {
//				file.getParentFile().mkdirs();
//			}
//		}
//		return true;
//	}
//
//	/*
//	 * (non-Javadoc)
//	 * 
//	 * @see org.eclipse.ui.dialogs.WizardDataTransferPage#saveWidgetValues()
//	 */
//	protected void saveWidgetValues() {
//
//		IDialogSettings settings = getDialogSettings();
//		if (settings != null) {
//			String[] directoryNames = settings
//					.getArray(STORE_DESTINATION_NAMES_ID);
//			if (directoryNames == null) {
//				directoryNames = new String[0];
//			}
//		
//			directoryNames = addToHistory(directoryNames, getDestinationValue());
//			settings.put(STORE_DESTINATION_NAMES_ID, directoryNames);
//			String current = getDestinationValue();
//			if (current != null && !current.equals("")) { //$NON-NLS-1$
//				settings.put(STORE_DESTINATION_ID, current);
//			}
//			// options
//			if (overwriteExistingFilesCheckbox != null) {
//				settings.put(STORE_OVERWRITE_EXISTING_FILES_ID,
//						overwriteExistingFilesCheckbox.getSelection());
//			}
//
//			if (shouldSaveTransferAll()) {
//
//				boolean transferAll = getTransferAll();
//				settings.put(TRANSFER_ALL_PREFERENCES_ID, transferAll);
//				if (!transferAll) {
//					Object[] elements = viewer.getCheckedElements();
//					String[] preferenceIds = new String[elements.length];
//					for (int i = 0; i < elements.length; i++) {
//						PreferenceTransferElement element = (PreferenceTransferElement) elements[i];
//						preferenceIds[i] = element.getID();
//					}
//					settings.put(TRANSFER_PREFERENCES_NAMES_ID, preferenceIds);
//				}
//			}
//		
//		}
//	}
//
//	/**
//	 * The Finish button was pressed. Try to do the required work now and answer
//	 * a boolean indicating success. If false is returned then the wizard will
//	 * not close.
//	 * 
//	 * @return boolean
//	 */
//	public boolean finish() {
//		// about to invoke the operation so save our state
//		saveWidgetValues();
//
//		IPreferenceFilter[] transfers = null;
//
//		if (getTransferAll()) {
//			// export all
//			transfers = new IPreferenceFilter[1];
//
//			// For export all create a preference filter that can export
//			// all nodes of the Instance and Configuration scopes
//			transfers[0] = new IPreferenceFilter() {
//
//				public String[] getScopes() {
//					return new String[] { InstanceScope.SCOPE,
//							ConfigurationScope.SCOPE };
//				}
//
//				public Map getMapping(String scope) {
//					return null;
//				}
//			};
//		} else {
//			transfers = getFilters();
//		}
//
//		boolean success = transfer(transfers);
//		// if it was a successful tranfer then store the name of the file to use
//		// it on the next export
//		if (success) {
//			saveWidgetValues();
//		}
//		return success;
//	}
//
//	/**
//	 * @return the preference transfer filters
//	 */
//	protected IPreferenceFilter[] getFilters() {
//		IPreferenceFilter[] filters = null;
//		PreferenceTransferElement[] transferElements;
//		transferElements = getPreferenceTransferElements();
//		if (transferElements != null) {
//			filters = new IPreferenceFilter[transferElements.length];
//			for (int j = 0; j < transferElements.length; j++) {
//				PreferenceTransferElement element = transferElements[j];
//				try {
//					filters[j] = element.getFilter();
//				} catch (CoreException e) {
//					WorkbenchPlugin.log(e.getMessage(), e);
//				}
//			}
//		} else {
//			filters = new IPreferenceFilter[0];
//		}
//
//		return filters;
//	}
//
//	/**
//	 * @return the list of transfer elements
//	 */
//	protected PreferenceTransferElement[] getPreferenceTransferElements() {
//		Object[] checkedElements = viewer.getCheckedElements();
//		PreferenceTransferElement[] transferElements = new PreferenceTransferElement[checkedElements.length];
//		System.arraycopy(checkedElements, 0, transferElements, 0,
//				checkedElements.length);
//		return transferElements;
//	}
//
//	/**
//	 * @param transfers
//	 * @return boolean
//	 */
//	protected abstract boolean transfer(IPreferenceFilter[] transfers);
//
//	/**
//	 * Check whether the internal state of the page is complete and update the
//	 * dialog
//	 */
//	public void setPageComplete() {
//		boolean complete = true;
//
//		if (!determinePageCompletion()) {
//			complete = false;
//		}
//
//		super.setPageComplete(complete);
//	}
//
//	/**
//	 * Returns whether this page is complete. This determination is made based
//	 * upon the current contents of this page's controls. Subclasses wishing to
//	 * include their controls in this determination should override the hook
//	 * methods <code>validateSourceGroup</code> and/or
//	 * <code>validateOptionsGroup</code>.
//	 * 
//	 * @return <code>true</code> if this page is complete, and
//	 *         <code>false</code> if incomplete
//	 * @see #validateSourceGroup
//	 * @see #validateOptionsGroup
//	 */
//	protected boolean determinePageCompletion() {
//		
//		// validate groups in order of priority so error message is the most important one
//		boolean complete = validateSourceGroup() && validateDestinationGroup()
//				&& validateOptionsGroup();
//
//		// Avoid draw flicker by not clearing the error
//		// message unless all is valid.
//		if (complete) {
//			setErrorMessage(null);
//		} else {
//			setErrorMessage(currentMessage);
//		}
//
//		return complete;
//	}
//
//	/**
//	 * Returns whether this page's options group's controls currently all
//	 * contain valid values.
//	 * <p>
//	 * The <code>WizardPreferencesPage</code> implementation of this method
//	 * returns <code>true</code> if the button to transfer all preferences is 
//	 * selected OR at least one of the individual items are checked. Subclasses 
//	 * may reimplement this method.
//	 * </p>
//	 * 
//	 * @return <code>true</code> indicating validity of all controls in the
//	 *         options group
//	 */
//	protected boolean validateOptionsGroup() {
//		boolean isValid = true;
//		if (!getTransferAll()) {
//			Object[] checkedElements = viewer.getCheckedElements();
//			if (checkedElements == null || checkedElements.length == 0) {
//				currentMessage = getNoOptionsMessage();
//				isValid = false;
//			}
//		}
//		return isValid;
//	}
//
//	/**
//	 * Returns whether this page's source specification controls currently all
//	 * contain valid values.
//	 * <p>
//	 * The <code>WizardDataTransferPage</code> implementation of this method
//	 * returns <code>true</code>. Subclasses may reimplement this hook
//	 * method.
//	 * </p>
//	 * 
//	 * @return <code>true</code> indicating validity of all controls in the
//	 *         source specification group
//	 */
//	protected boolean validateSourceGroup() {
//		return true;
//	}
//
//	/**
//	 * Answer the string to display in self as the destination type
//	 * 
//	 * @return java.lang.String
//	 */
//	protected abstract String getDestinationLabel();
//
//	/**
//	 * Answer the contents of self's destination specification widget
//	 * 
//	 * @return java.lang.String
//	 */
//	protected String getDestinationValue() {
//		return destinationNameField.getText().trim();
//	}
//
//	/**
//	 * Set the current input focus to self's destination entry field
//	 */
//	protected void giveFocusToDestination() {
//		destinationNameField.setFocus();
//	}
//
//	/**
//	 * Open an appropriate destination browser so that the user can specify a
//	 * source to import from
//	 */
//	protected void handleDestinationBrowseButtonPressed() {
//		FileDialog dialog = new FileDialog(getContainer().getShell(),
//				getFileDialogStyle());
//		dialog.setText(getFileDialogTitle());
//		dialog.setFilterPath(getDestinationValue());
//		dialog.setFilterExtensions(new String[] { "*.epf" ,"*.*"}); //$NON-NLS-1$ //$NON-NLS-2$
//		String selectedFileName = dialog.open();
//
//		if (selectedFileName != null) {
//			setDestinationValue(selectedFileName);
//		}
//	}
//
//	protected abstract String getFileDialogTitle();
//
//	protected abstract int getFileDialogStyle();
//
//	/**
//	 * Handle all events and enablements for widgets in this page
//	 * 
//	 * @param e
//	 *            Event
//	 */
//	public void handleEvent(Event e) {
//		Widget source = e.widget;
//
//		if (source == destinationBrowseButton) {
//			handleDestinationBrowseButtonPressed();
//		}
//
//		updatePageCompletion();
//	}
//
//	/**
//	 * Determine if the page is complete and update the page appropriately.
//	 */
//	protected void updatePageCompletion() {
//		boolean pageComplete = determinePageCompletion();
//		setPageComplete(pageComplete);
//		if (pageComplete) {
//			setMessage(null);
//		}
//	}
//
//	/**
//     * Adds an entry to a history, while taking care of duplicate history items
//     * and excessively long histories.  The assumption is made that all histories
//     * should be of length <code>WizardDataTransferPage.COMBO_HISTORY_LENGTH</code>.
//     *
//     * @param history the current history
//     * @param newEntry the entry to add to the history
//     */
//    protected String[] addToHistory(String[] history, String newEntry) {
//        java.util.ArrayList l = new java.util.ArrayList(Arrays.asList(history));
//        addToHistory(l, newEntry);
//        String[] r = new String[l.size()];
//        l.toArray(r);
//        return r;
//    }
//
//    /**
//     * Adds an entry to a history, while taking care of duplicate history items
//     * and excessively long histories.  The assumption is made that all histories
//     * should be of length <code>WizardDataTransferPage.COMBO_HISTORY_LENGTH</code>.
//     *
//     * @param history the current history
//     * @param newEntry the entry to add to the history
//     */
//    protected void addToHistory(List history, String newEntry) {
//        history.remove(newEntry);
//        history.add(0, newEntry);
//
//        // since only one new item was added, we can be over the limit
//        // by at most one item
//        if (history.size() > COMBO_HISTORY_LENGTH) {
//			history.remove(COMBO_HISTORY_LENGTH);
//		}
//    }
//
//	/**
//	 * Hook method for restoring widget values to the values that they held last
//	 * time this wizard was used to completion.
//	 */
//	protected void restoreWidgetValues() {
//
//		IDialogSettings settings = getDialogSettings();
//		if (shouldSaveTransferAll() && settings != null) {
//
//			boolean transferAll;
//			if (settings.get(TRANSFER_ALL_PREFERENCES_ID) == null)
//				transferAll = true;
//			else
//				transferAll = settings
//					.getBoolean(TRANSFER_ALL_PREFERENCES_ID);
//			transferAllButton.setSelection(transferAll);
//			if (!transferAll) {
//				String[] preferenceIds = settings
//						.getArray(TRANSFER_PREFERENCES_NAMES_ID);
//				if (preferenceIds != null) {
//					PreferenceTransferElement[] transfers = getTransfers();
//					for (int i = 0; i < transfers.length; i++) {
//						for (int j = 0; j < preferenceIds.length; j++) {
//							if (transfers[i].getID().equals(preferenceIds[j])) {
//								viewer.setChecked(transfers[i], true);
//								break;
//							}
//						}
//					}
//				}
//			}
//		} else {
//			transferAllButton.setSelection(true);
//		}
//		updateEnablement();
//
//		if (settings != null) {
//			String[] directoryNames = settings
//					.getArray(STORE_DESTINATION_NAMES_ID);
//			if (directoryNames != null) {
//				// destination
//				setDestinationValue(directoryNames[0]);
//				for (int i = 0; i < directoryNames.length; i++) {
//					addDestinationItem(directoryNames[i]);
//				}
//
//				String current = settings.get(STORE_DESTINATION_ID);
//				if (current != null) {
//					setDestinationValue(current);
//				}
//				// options
//				if (overwriteExistingFilesCheckbox != null) {
//					overwriteExistingFilesCheckbox.setSelection(settings
//							.getBoolean(STORE_OVERWRITE_EXISTING_FILES_ID));
//				}
//			}
//		}
//	}
//
//	protected abstract boolean shouldSaveTransferAll();
//
//	private boolean getOverwriteExisting() {
//		return overwriteExistingFilesCheckbox.getSelection();
//	}
//
//	private boolean getTransferAll() {
//		return transferAllButton.getSelection();
//	}
//
//	/**
//	 * Set the contents of self's destination specification widget to the passed
//	 * value
//	 * 
//	 * @param value
//	 *            java.lang.String
//	 */
//	protected void setDestinationValue(String value) {
//		destinationNameField.setText(value);
//	}
//
//	/*
//	 * (non-Javadoc)
//	 * 
//	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
//	 */
//	public void dispose() {
//		super.dispose();
//		transfers = null;
//	}
//
//	/*
//	 * (non-Javadoc)
//	 * 
//	 * @see org.eclipse.ui.dialogs.WizardDataTransferPage#allowNewContainerName()
//	 */
//	protected boolean allowNewContainerName() {
//		return true;
//	}
//
//	/**
//	 * The <code>WizardDataTransfer</code> implementation of this
//	 * <code>IOverwriteQuery</code> method asks the user whether the existing
//	 * resource at the given path should be overwritten.
//	 * 
//	 * @param pathString
//	 * @return the user's reply: one of <code>"YES"</code>, <code>"NO"</code>,
//	 *         <code>"ALL"</code>, or <code>"CANCEL"</code>
//	 */
//	public String queryOverwrite(String pathString) {
//
//		Path path = new Path(pathString);
//
//		String messageString;
//		// Break the message up if there is a file name and a directory
//		// and there are at least 2 segments.
//		if (path.getFileExtension() == null || path.segmentCount() < 2) {
//			messageString = NLS.bind(
//					PreferencesMessages.WizardDataTransfer_existsQuestion,
//					pathString);
//		} else {
//			messageString = NLS
//					.bind(
//							PreferencesMessages.WizardDataTransfer_overwriteNameAndPathQuestion,
//							path.lastSegment(), path.removeLastSegments(1)
//									.toOSString());
//		}
//
//		final MessageDialog dialog = new MessageDialog(getContainer()
//				.getShell(), PreferencesMessages.Question, null, messageString,
//				MessageDialog.QUESTION, new String[] {
//						IDialogConstants.YES_LABEL,
//						IDialogConstants.YES_TO_ALL_LABEL,
//						IDialogConstants.NO_LABEL,
//						IDialogConstants.NO_TO_ALL_LABEL,
//						IDialogConstants.CANCEL_LABEL }, 0) {
//			protected int getShellStyle() {
//				return super.getShellStyle() | SWT.SHEET;
//			}
//		};
//		String[] response = new String[] { YES, ALL, NO, NO_ALL, CANCEL };
//		// run in syncExec because callback is from an operation,
//		// which is probably not running in the UI thread.
//		getControl().getDisplay().syncExec(new Runnable() {
//			public void run() {
//				dialog.open();
//			}
//		});
//		return dialog.getReturnCode() < 0 ? CANCEL : response[dialog
//				.getReturnCode()];
//	}
//
//	private void updateEnablement() {
//		boolean transferAll = getTransferAll();
//		selectAllButton.setEnabled(!transferAll);
//		deselectAllButton.setEnabled(!transferAll);
//	}
//}
